#include <iostream>
#include <deque>

using namespace std;
//deque 插入和删除:向deque容器中插入和删除数据
//函数原型：
//两端插入操作：
//1、push_back(elem);         //在容器尾部添加一个数据
//2、push_front(elem);        //在容器头部插入一个数据
//3、pop_back();              //删除容器最后一个数据
//4、pop_front();             //删除容器第一个数据

//指定位置操作：
//1、insert(pos,elem);       //在pos位置插入一个elem元素的拷贝，返回新数据的位置
//2、insert(pos,n,elem);     //在pos位置插入n个elem数据，无返回值
//3、insert(pos,beg,end);    //在pos位置插入[beg,end)区间的数据，无返回值
//4、clear();                //清空容器的所有数据
//5、erase(beg,end);         //删除[beg,end)区间的数据，返回下一个数据的位置。
//6、erase(pos);             //删除pos位置的数据，返回下一个数据的位置

void printD(const deque<int> &d) {
    for (deque<int>::const_iterator it = d.begin(); it != d.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;
}

//两端操作
void test1() {
    deque<int> d;
    d.push_back(10);//尾插
    d.push_back(20);
    d.push_front(100);//头插
    d.push_front(200);
    printD(d);//200 100 10 20

    d.pop_back();//尾删
    d.pop_front();//头删
    printD(d);//100 10
}

void test2() {
    deque<int> d;
    d.push_back(10);
    d.push_back(20);
    d.push_front(100);
    d.push_front(200);
    printD(d);

    d.insert(d.begin(), 1000);//insert插入
    printD(d);
    d.insert(d.begin(), 2, 10000);//insert重载的版本
    printD(d);

    deque<int> d2;
    d2.push_back(1);
    d2.push_back(2);
    d2.push_back(3);
    d.insert(d.begin(), d2.begin(), d2.end());//按照区间进行插入
    printD(d);//1 2 3 10000 10000 1000 200 100 10 20
}

void test3() {
    deque<int> d;
    d.push_back(10);
    d.push_back(20);
    d.push_front(100);
    d.push_front(200);
    printD(d);

    d.erase(d.begin()+1);//删除
    printD(d);

    //d.erase(d.begin(),d.end());//按照区间的方式删除
    d.clear();//清空
    printD(d);
}

int main() {
    test1();
    cout << "=========" << endl;
    test2();
    cout << "=========" << endl;
    test3();
    return 0;
}